{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "c4f1f508",
   "metadata": {},
   "source": [
    "# Hypertension Detection From High-Dimensional Representation of Photoplethysmogram (PPG) Signals\n",
    "\n",
    "Accepted at IEEE-EMBS International Conference on Biomedical and Health Informatics (BHI’23)\n",
    "\n",
    "Hypertension is commonly referred to as the \"silent killer\", since it can lead to severe health complications without any visible symptoms. Early detection of hypertension is crucial in preventing significant health issues. Although some studies suggest a relationship between blood pressure and certain vital signals, such as Photoplethysmogram (PPG), reliable generalization of the proposed blood pressure estimation methods is not yet guaranteed. This lack of certainty has resulted in some studies doubting the existence of such relationships, or considering them weak and limited to heart rate and blood pressure. In this work, a high-dimensional representation technique based on random convolution kernels is proposed for hypertension detection using PPG signals. The results show that this relationship extends beyond heart rate and blood pressure, demonstrating the feasibility of hypertension detection with generalization on unseen subjects. Additionally, the utilized transform using convolution kernels, as an end-to-end time-series feature extractor, outperforms the methods proposed in the previous studies and state-of-the-art deep learning models.\n",
    "\n",
    "This notebook provides the code for training and testing a model to detect hypertension from PPG signals using random convolution kernels (MiniROCKET).\n",
    "\n",
    "[Paper: arXiv:2308.02425](https://arxiv.org/abs/2308.02425)\n",
    "\n",
    "\n",
    "Please use the following citation:\n",
    "\n",
    "```bibtex\n",
    "@misc{hasanzadeh2023hypertension,\n",
    "      title={Hypertension Detection From High-Dimensional Representation of Photoplethysmogram Signals}, \n",
    "      author={Navid Hasanzadeh and Shahrokh Valaee and Hojjat Salehinejad},\n",
    "      year={2023},\n",
    "      eprint={2308.02425},\n",
    "      archivePrefix={arXiv},\n",
    "      primaryClass={eess.SP}\n",
    "}\n",
    "```\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "74eab80a",
   "metadata": {},
   "source": [
    "## Parameters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "647f1be2",
   "metadata": {},
   "outputs": [],
   "source": [
    "# The ratio of the training set (with 1 million samples) that will be used for training the models.\n",
    "# Values near 1.0 -> Take longer and require more RAM (1.0 requires about 400GB), but yield higher accuracy.\n",
    "# See our paper for more details.\n",
    "training_data_ratio = 0.10\n",
    "# The dataset location\n",
    "train_records_adr = \"train/*.tfrecord\"\n",
    "test_records_adr = \"test/*.tfrecord\""
   ]
  },
  {
   "cell_type": "markdown",
   "id": "55e852a3",
   "metadata": {},
   "source": [
    "## Importing Libraries"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "aaf2cc26",
   "metadata": {},
   "outputs": [],
   "source": [
    "import h5py\n",
    "import tensorflow as tf\n",
    "from pyampd.ampd import find_peaks\n",
    "import glob\n",
    "from tqdm import tqdm\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "053dfb0e",
   "metadata": {},
   "source": [
    "## Preparing and Loading Dataset"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3c86f10b",
   "metadata": {},
   "source": [
    "In this study, the PPG signals and corresponding BPs derived from the MIMIC-III dataset are used. The BP values are categorized into normal and hypertension classes based on ESC/ESH guidelines. This dataset comprises $3750$ subjects for training and $625$ subjects for testing. The training and test datasets are standardized and divided at subject level to avoid any overlap. There are $1,000,000$ PPG signals for training, $250,000$ samples for validation, and $250,000$ samples for testing. Each PPG sample has a duration of $7$ seconds, and the sampling rate is $125$ Hz. \n",
    "\n",
    "\n",
    "The dataset can be downloaded from :\n",
    "\n",
    "https://zenodo.org/record/5590603/files/MIMIC-III_ppg_dataset.h5?download=1.\n",
    "\n",
    "The size of the dataset is approximately 32 GB. You need to convert the h5 file to tfrecords using h5_to_tfrecord.py:\n",
    "\n",
    "https://github.com/Fabian-Sc85/non-invasive-bp-estimation-using-deep-learning/tree/main"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "5315b758",
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_hypertension_label(sysBP,diaBP):\n",
    "    if(sysBP<120 and diaBP<80):\n",
    "        return 0\n",
    "    if((sysBP>=120 and sysBP<=129) or (diaBP>=80 and diaBP<=84)):\n",
    "        return 0\n",
    "    if((sysBP>=130 and sysBP<=139) or (diaBP>=85 and diaBP<=89)):\n",
    "        return 0\n",
    "    if((sysBP>=140 and sysBP<=159) or (diaBP>=90 and diaBP<=99)):\n",
    "        return 1\n",
    "    if((sysBP>=160 and sysBP<=179) or (diaBP>=100 and diaBP<=109)):\n",
    "        return 1\n",
    "    if(sysBP>=180 or diaBP>110):\n",
    "        return 1    \n",
    "    return 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "e751354d",
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_mimiciii_record(filename, fs=125):\n",
    "  raw_dataset = tf.data.TFRecordDataset([filename])\n",
    "  dset = raw_dataset.take(count=1000)\n",
    "  example = tf.train.Example()\n",
    "  dset_list = list(dset)\n",
    "  ppg_records = []\n",
    "  sys_records = []\n",
    "  dia_records = []\n",
    "  bp_records = []\n",
    "  hr_records = []\n",
    "  for i in range(len(list(dset))):\n",
    "    element = dset_list[i]\n",
    "    example.ParseFromString(element.numpy())\n",
    "    ppg = np.array(example.features.feature['ppg'].float_list.value)\n",
    "    ppg = ppg - np.mean(ppg)\n",
    "    ppg = ppg / np.std(ppg)\n",
    "    sys = np.max(example.features.feature['label'].float_list.value)\n",
    "    dia = np.min(example.features.feature['label'].float_list.value)\n",
    "    onsets = find_peaks(ppg) # using AMPD algorithm for peak detection\n",
    "    hr = np.round(fs / (0.00001 + np.median(np.diff(onsets))) * 60,0)\n",
    "    hr_records.append(hr)\n",
    "    ppg_records.append(ppg)\n",
    "    sys_records.append(sys)\n",
    "    dia_records.append(dia)\n",
    "    bp_records.append(get_hypertension_label(sys,dia))\n",
    "  return ppg_records, sys_records, dia_records, hr_records, bp_records"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "13ea3565",
   "metadata": {},
   "outputs": [],
   "source": [
    "def create_mimiciii_dataset(address):\n",
    "    adr_all = glob.glob(address)\n",
    "    bp_classes = []\n",
    "    ppg_all = []\n",
    "    hr_all = []\n",
    "    for adr in tqdm(adr_all):\n",
    "        ppg_records, sys_records, dia_records, hr_records, bp_records = get_mimiciii_record(adr)\n",
    "        ppg_all.extend(ppg_records)\n",
    "        bp_classes.extend(bp_records)\n",
    "        hr_all.extend(hr_records)\n",
    "    return ppg_all, hr_all, bp_classes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "51654f12",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|████████████████████████████████████████████████████████████████████████████| 1000/1000 [1:14:58<00:00,  4.50s/it]\n"
     ]
    }
   ],
   "source": [
    "X_train, X_HR_train, y_train = create_mimiciii_dataset(train_records_adr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "11b5e0e4",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 94%|███████████████████████████████████████████████████████████████████████████▌    | 236/250 [17:37<01:10,  5.04s/it]C:\\Users\\16478\\anaconda3\\envs\\keras_gpu\\lib\\site-packages\\numpy\\core\\fromnumeric.py:3432: RuntimeWarning: Mean of empty slice.\n",
      "  return _methods._mean(a, axis=axis, dtype=dtype,\n",
      "C:\\Users\\16478\\anaconda3\\envs\\keras_gpu\\lib\\site-packages\\numpy\\core\\_methods.py:190: RuntimeWarning: invalid value encountered in double_scalars\n",
      "  ret = ret.dtype.type(ret / rcount)\n",
      "100%|████████████████████████████████████████████████████████████████████████████████| 250/250 [18:47<00:00,  4.51s/it]\n"
     ]
    }
   ],
   "source": [
    "X_test, X_HR_test, y_test = create_mimiciii_dataset(test_records_adr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "49ecf5e5",
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train = np.array(X_train)\n",
    "X_test = np.array(X_test)\n",
    "X_HR_train = np.array(X_HR_train).reshape(-1,1)\n",
    "X_HR_test = np.array(X_HR_test).reshape(-1,1)\n",
    "y_train = np.array(y_train)\n",
    "y_test = np.array(y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "6a96038c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "X_train:  (1000000, 875)\n",
      "X_test:  (250000, 875)\n",
      "X_HR_train:  (1000000, 1)\n",
      "X_HR_test:  (250000, 1)\n",
      "y_train:  (1000000,)\n",
      "y_test:  (250000,)\n"
     ]
    }
   ],
   "source": [
    "print(\"X_train: \", X_train.shape)\n",
    "print(\"X_test: \", X_test.shape)\n",
    "print(\"X_HR_train: \", X_HR_train.shape)\n",
    "print(\"X_HR_test: \", X_HR_test.shape)\n",
    "print(\"y_train: \", y_train.shape)\n",
    "print(\"y_test: \", y_test.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "196637c0",
   "metadata": {},
   "source": [
    "#### The histogram of the training set"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "cb1b4a83",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sn"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "32f7cee2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "([<matplotlib.axis.XTick at 0x1be60ea4550>,\n",
       "  <matplotlib.axis.XTick at 0x1be60ea4520>],\n",
       " [Text(0, 0, 'Normal'), Text(1, 0, 'Hypertension')])"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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/QMgoqOjNcqysrKETCYTe/fuVZcFBgYKhUIhHj58qPOmUChEYGCguv748eOFQqEQt27d0lj3xIkThVwuF3l5eRrPT2XG6apVq4RMJhMffPCB2LRpk9i+fbvo3bu30NfXF/v27VPXKx9rzs7O4osvvhBKpVJs2bJFnD9/XgwYMEAAEMeOHVPfHjx4IIQQYsSIEcLQ0FBMmDBB7N69W/z444+iRYsWws7OTuTk5GiMiQYNGog33nhDLF68WCiVShEeHi4AiBUrVqjrxcXFCX19fREdHS32798vdu/eLeLj48X06dPVdXS9pr7++msBQAwePFjs3LlTrFy5UjRp0kRYWlqKv//+W+M5KR8n3377rdi3b5+YNm2akMlkIiYmRlQFADFq1Cj1cvnYbtSokejatavYsGGD2Lt3r7h06ZK4deuWCAoKEqtWrRIHDhwQu3fvFp9//rnQ09PT2H8hhHB2dtYYF+Xj3sXFRXz88cdi586dYu3atcLJyUm88cYborS0VGP/nnyNlrdt166dWL9+vUhJSRFdunQRBgYG4sKFC+p6u3btEnp6eqJLly5i8+bN4qeffhL/+te/hIuLi6jM23qzZs2Eubm5+O6770RGRoZQqVQ665WVlYl3331XKBQKERMTI5RKpVi6dKlo1KiRaNWqlbh3754QQoiTJ0+KJk2aiLfeeks97k6ePPnMfqj3u9I1a6CiIAIgNm7cqC57+PChsLGxEQA0diI/P1/o6+uLiIgIrXX269dPY1tHjx4VAMTMmTN19kWlUomHDx+KK1euCABi69atWut8/EVT2bblbw5z5szRaBMeHi7kcrn6if75558FADFlypSKHi6RmZkpDAwMxOjRozXKi4qKhL29vRg4cKAQ4tEgadiwoWjbtq3GQLp8+bIwNDSsUhAJIcS+ffsEADF//nwhhO4g+uijj4SxsbHIzMzUWE+vXr2Eqamp+o25/AXZqVMnrW3W9Ll/UmlpqXj48KHo3r271njQFUTx8fGifv364uHDh1p9etrt8TecCxcuCD09PfG///u/6rL79++LBg0aaPzjUdlxevfuXWFlZSX69OmjUa+srEx4eHiIdu3aqcvKx9q0adO0HotRo0bpfCM6duyYACC+++47jfKsrCxhYmIiJk2apC7r3LmzACB+++03jbqtWrUS/v7+6uXevXsLT09PrW097snX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0aIl7t+/V+N1Ud1hYmKKM2cyGEZETyFZEFlbW0NfX1/r6Cc3N1frKKlcXFwcfH19MXHiRABAmzZtoFAo0LFjR8ycORMODg5abSIjIxEREaFeLv8qjKrKy8vD/fv38K/h0bBwcKlye6p7CrMv47flMcjLy2MQET2FZEFkZGQELy8vKJVK9OvXT12uVCrRt29fnW3u3bsHAwPNLuvr6wN4dCSli7GxMYyNjWup14CFgwusnNxqbX1ERHWdpFfNRUREYOnSpVi+fDkyMjIwfvx4ZGZmIiwsDMCjo5lhw4ap6/fp0webNm3CokWLcPHiRRw9ehRjxoxBu3bt0LBhQ6l2g4iIakDSc0SDBg1Cfn4+YmNjkZ2dDXd3d6SkpMDZ2RkAkJ2drfGZoqCgIBQVFWHBggWYMGEC6tWrh27dumH27NlS7QIREdWQ5BcrhIeHIzw8XOd9SUlJWmWjR4/G6NGjn3OviIjoRZH8K36IiKhuYxAREZGkGERERCQpBhEREUmKQURERJJiEBERkaQYREREJCkGERERSYpBREREkmIQERGRpBhEREQkKQYRERFJikFERESSYhAREZGkGERERCQpBhEREUmKQURERJJiEBERkaQYREREJCkGERERSYpBREREkmIQERGRpBhEREQkKQYRERFJikFERESSYhAREZGkGERERCQpBhEREUmKQURERJJiEBERkaQYREREJCkGERERSYpBREREkmIQERGRpBhEREQkKQYRERFJikFERESSYhAREZGkGERERCQpBhEREUmKQURERJJiEBERkaQYREREJCkGERERSUryIEpISICrqyvkcjm8vLxw5MiRp9YvLi7GlClT4OzsDGNjYzRt2hTLly9/Qb0lIqLaZiDlxpOTkzFu3DgkJCTA19cXS5YsQa9evXD69Gk4OTnpbDNw4EBcv34dy5YtQ7NmzZCbm4vS0tIX3HMiIqotkgbR3LlzERISgtDQUABAfHw89uzZg0WLFiEuLk6r/u7du3H48GFcvHgRVlZWAAAXF5cX2WUiIqplkk3NlZSUIC0tDX5+fhrlfn5+SE1N1dlm27Zt8Pb2xpw5c9CoUSM0b94cn3/+Oe7fv/8iukxERM+BZEdEeXl5KCsrg52dnUa5nZ0dcnJydLa5ePEifvnlF8jlcmzevBl5eXkIDw9HQUFBheeJiouLUVxcrF4u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dYKVk5vU3SB6aUkWRNbW1tDX19c6+snNzdU6SnpScnIyQkJC8NNPP6FHjx5PrWtsbAxjY+Ma95eIiJ4Pya6aMzIygpeXF5RKpUa5UqlEhw4dKmy3du1aBAUF4ccff8R77733vLtJRETPmaRTcxERERg6dCi8vb3h4+ODH374AZmZmQgLCwPwaFrtn3/+wcqVKwE8CqFhw4Zh3rx5aN++vfpoysTEBJaWlpLtBxERVZ+kQTRo0CDk5+cjNjYW2dnZcHd3R0pKCpydnQEA2dnZGp8pWrJkCUpLSzFq1CiMGjVKXR4YGIikpKQX3X0iIqoFkl+sEB4ejvDwcJ33PRkuhw4dev4dIiKiF0ryr/ghIqK6jUFERESSYhAREZGkGERERCQpBhEREUmKQURERJJiEBERkaQYREREJCkGERERSYpBREREkmIQERGRpBhEREQkKQYRERFJikFERESSYhAREZGkGERERCQpBhEREUmKQURERJJiEBERkaQYREREJCkGERERSYpBREREkmIQERGRpBhEREQkKQYRERFJikFERESSYhAREZGkGERERCQpBhEREUmKQURERJJiEBERkaQYREREJCkGERERSYpBREREkmIQERGRpBhEREQkKQYRERFJikFERESSYhAREZGkGERERCQpBhEREUmKQURERJJiEBERkaQYREREJCnJgyghIQGurq6Qy+Xw8vLCkSNHnlr/8OHD8PLyglwuR5MmTbB48eIX1FMiInoeJA2i5ORkjBs3DlOmTEF6ejo6duyIXr16ITMzU2f9S5cuISAgAB07dkR6ejqioqIwZswYbNy48QX3nIiIaoukQTR37lyEhIQgNDQULVu2RHx8PBwdHbFo0SKd9RcvXgwnJyfEx8ejZcuWCA0NxfDhw/Htt9++4J4TEVFtMZBqwyUlJUhLS8PkyZM1yv38/JCamqqzzbFjx+Dn56dR5u/vj2XLluHhw4cwNDTUalNcXIzi4mL18u3btwEAhYWFVervnTt3AAAFV86itPh+ldpS3VSYfQUAcPufczA0kEncG3oVFOY8mg26c+dOld6jyusKIZ5Lv543yYIoLy8PZWVlsLOz0yi3s7NDTk6OzjY5OTk665eWliIvLw8ODg5abeLi4hATE6NV7ujoWK1+p62eVa12VHf930/xUneBXjGdO3euVruioiJYWlrWcm+e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\n",
      "text/plain": [
       "<Figure size 400x300 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(4,3))\n",
    "sn.histplot(\n",
    "    data=y_train,   \n",
    "    discrete=True,\n",
    "    stat='probability'\n",
    ")\n",
    "plt.ylabel('Ratio')\n",
    "plt.title(\"Imbalanced Normal/Hypertension Training Set\")\n",
    "plt.xticks([0,1], ['Normal','Hypertension'])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "98d82a50",
   "metadata": {},
   "source": [
    "#### A sample of PPG in the training set"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "de92ddc0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 0, 'Sample')"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 400x300 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(4,3))\n",
    "plt.plot(X_train[600][0:200])\n",
    "plt.ylabel(\"PPG\")\n",
    "plt.xlabel(\"Sample\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fcb83904",
   "metadata": {},
   "source": [
    "## Feature Extraction using MiniROCKET"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "62cb6040",
   "metadata": {},
   "outputs": [],
   "source": [
    "from minirocket_multivariate import fit\n",
    "from minirocket_multivariate import transform"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "9bb41f21",
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train_part = X_train[:int(training_data_ratio*len(X_train))]\n",
    "y_train_part = y_train[:int(training_data_ratio*len(y_train))]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "cee8624a",
   "metadata": {},
   "outputs": [],
   "source": [
    "X_test = X_test[:,np.newaxis,:]\n",
    "X_train_part = X_train_part[:,np.newaxis,:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "bc9baf89",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "X_train_part:  (100000, 1, 875)\n",
      "X_test:  (250000, 1, 875)\n"
     ]
    }
   ],
   "source": [
    "print(\"X_train_part: \", X_train_part.shape)\n",
    "print(\"X_test: \", X_test.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "ffc81dc5",
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train_part = X_train_part.astype(np.float32)\n",
    "X_test = X_test.astype(np.float32)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "0c97a481",
   "metadata": {},
   "outputs": [],
   "source": [
    "parameters = fit(X_train_part, num_features=10000)\n",
    "X_training_transform = transform(X_train_part, parameters)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "290d2e55",
   "metadata": {},
   "outputs": [],
   "source": [
    "X_test_transform = transform(X_test, parameters)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "f465195e",
   "metadata": {},
   "outputs": [],
   "source": [
    "X_training_minirocket = X_training_transform\n",
    "X_test_minirocket = X_test_transform"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "a444710c",
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train_mean = X_training_minirocket.mean(0)\n",
    "X_train_std = X_training_minirocket.std(0)\n",
    "\n",
    "\n",
    "X_train_minirocket = X_training_minirocket -X_train_mean\n",
    "X_train_minirocket = X_train_minirocket / (X_train_std + 0.00001)\n",
    "\n",
    "\n",
    "X_test_minirocket = X_test_minirocket - X_train_mean\n",
    "X_test_minirocket = X_test_minirocket / (X_train_std + 0.00001)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "edb6f4f1",
   "metadata": {},
   "source": [
    "## Training and Testing Models"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "a2dcc706",
   "metadata": {},
   "outputs": [],
   "source": [
    "from imblearn.ensemble import BalancedRandomForestClassifier\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.linear_model import RidgeClassifierCV\n",
    "from sklearn.metrics import confusion_matrix\n",
    "from sklearn.metrics import f1_score\n",
    "from sklearn.metrics import precision_score\n",
    "from sklearn.metrics import classification_report"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d2439096",
   "metadata": {},
   "source": [
    "### Model: Heart-rate + RidgeClassifierCV"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "45098c14",
   "metadata": {},
   "outputs": [],
   "source": [
    "X_HR_train_part = X_HR_train[:int(training_data_ratio*len(y_train))]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "971d4739",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Remove NaNs\n",
    "col_mean = np.nanmean(X_HR_train_part, axis=0)\n",
    "inds = np.where(np.isnan(X_HR_train_part))\n",
    "X_HR_train_part[inds] = np.take(col_mean, inds[1])\n",
    "inds = np.where(np.isnan(X_HR_test))\n",
    "X_HR_test[inds] = np.take(col_mean, inds[1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "e8c055e6",
   "metadata": {},
   "outputs": [],
   "source": [
    "clf = RidgeClassifierCV(class_weight=\"balanced\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "b36fdacc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-4 {color: black;background-color: white;}#sk-container-id-4 pre{padding: 0;}#sk-container-id-4 div.sk-toggleable {background-color: white;}#sk-container-id-4 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-4 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-4 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-4 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-4 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-4 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-4 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-4 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-4 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-4 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-4 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-4 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-4 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-4 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-4 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-4 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-4 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-4 div.sk-item {position: relative;z-index: 1;}#sk-container-id-4 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-4 div.sk-item::before, #sk-container-id-4 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-4 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-4 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-4 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-4 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-4 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-4 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-4 div.sk-label-container {text-align: center;}#sk-container-id-4 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-4 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-4\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>RidgeClassifierCV(class_weight=&#x27;balanced&#x27;)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-4\" type=\"checkbox\" checked><label for=\"sk-estimator-id-4\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">RidgeClassifierCV</label><div class=\"sk-toggleable__content\"><pre>RidgeClassifierCV(class_weight=&#x27;balanced&#x27;)</pre></div></div></div></div></div>"
      ],
      "text/plain": [
       "RidgeClassifierCV(class_weight='balanced')"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "clf.fit(X_HR_train_part, y_train_part)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "94ae1caf",
   "metadata": {},
   "outputs": [],
   "source": [
    "predictions = clf.predict(X_HR_test)\n",
    "accuracy = np.mean(predictions==y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "3860d24b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Results (using 10.0% of training set)\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "      Normal       0.79      0.50      0.61    195972\n",
      "Hypertension       0.22      0.53      0.32     54028\n",
      "\n",
      "    accuracy                           0.50    250000\n",
      "   macro avg       0.51      0.51      0.46    250000\n",
      "weighted avg       0.67      0.50      0.55    250000\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print(\"Results (using {}% of training set)\".format(training_data_ratio*100))\n",
    "print(classification_report(y_test,predictions, target_names=['Normal', 'Hypertension']))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "id": "7b89ff75",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: HR + RidgeClassifierCV - using 10.0% of training set\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 400x300 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "matrix = confusion_matrix(y_test, predictions, labels=[0,1]).astype(np.float32)\n",
    "s = matrix.sum(axis=1)\n",
    "for i in range(2):\n",
    "    matrix[i,:]=matrix[i,:] /s[i]\n",
    "matrix = np.round(matrix,3)  * 100\n",
    "df_cm = pd.DataFrame(matrix, ['Normal', 'Hypertension'], ['Normal', 'Hypertension'])\n",
    "plt.figure(figsize=(4,3))\n",
    "sn.set(font_scale=1.4) # for label size\n",
    "sn.heatmap(df_cm, annot=True, annot_kws={\"size\": 16}, fmt='.1f') # font size\n",
    "print(\"Model: HR + RidgeClassifierCV - using {}% of training set\".format(training_data_ratio*100))\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4c03a85e",
   "metadata": {},
   "source": [
    "### Model: MiniROCKET + BalancedRandomForestClassifier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "a22bc993",
   "metadata": {},
   "outputs": [],
   "source": [
    "clf = BalancedRandomForestClassifier(n_estimators=100, n_jobs=-1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "id": "0676a952",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-5 {color: black;background-color: white;}#sk-container-id-5 pre{padding: 0;}#sk-container-id-5 div.sk-toggleable {background-color: white;}#sk-container-id-5 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-5 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-5 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-5 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-5 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-5 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-5 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-5 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-5 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-5 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-5 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-5 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-5 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-5 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-5 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-5 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-5 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-5 div.sk-item {position: relative;z-index: 1;}#sk-container-id-5 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-5 div.sk-item::before, #sk-container-id-5 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-5 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-5 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-5 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-5 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-5 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-5 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-5 div.sk-label-container {text-align: center;}#sk-container-id-5 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-5 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-5\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>BalancedRandomForestClassifier(n_jobs=-1)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-5\" type=\"checkbox\" checked><label for=\"sk-estimator-id-5\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">BalancedRandomForestClassifier</label><div class=\"sk-toggleable__content\"><pre>BalancedRandomForestClassifier(n_jobs=-1)</pre></div></div></div></div></div>"
      ],
      "text/plain": [
       "BalancedRandomForestClassifier(n_jobs=-1)"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "clf.fit(X_train_minirocket, y_train_part)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "id": "62ced4c0",
   "metadata": {},
   "outputs": [],
   "source": [
    "predictions = clf.predict(X_test_minirocket)\n",
    "accuracy = np.mean(predictions==y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "id": "5d240bd8",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Results (using 10.0% of training set)\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "      Normal       0.87      0.65      0.75    195972\n",
      "Hypertension       0.34      0.66      0.45     54028\n",
      "\n",
      "    accuracy                           0.65    250000\n",
      "   macro avg       0.61      0.65      0.60    250000\n",
      "weighted avg       0.76      0.65      0.68    250000\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print(\"Results (using {}% of training set)\".format(training_data_ratio*100))\n",
    "print(classification_report(y_test,predictions, target_names=['Normal', 'Hypertension']))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "id": "4371ef94",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: MiniROCKET + BalancedRandomForestClassifier - using 10.0% of training set\n"
     ]
    },
    {
     "data": {
      "image/png": "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EP8hL1++JDIyMr+bkSlbW1vGjBlD375987sp4i8SsA1Qo0YNNBoN8+bN4969e/ndHCFEASUB2wB169ZlwIABxMbGMnXqVFJSUgy67tSpU4wYMYIGDRrg6upKq1atmD17doZ8eFqufMuWLUyePJlatWpRr149fHx8dPnZb775hsOHD9OnTx9q1apFgwYNmDBhAs+fPyc+Pp6vvvqK5s2bU6tWLTp16sSOHTsytOf58+csWLCATp064e7ujqurK82aNWPChAlcv349N35U+S4+Pl73837x4kWG88+fP8fV1ZVu3boBf//sfX198fX1pV27dri5udGiRQtmz56t9x6KouDr60uvXr1wd3endu3a9OjRA19f3wyPqkobC7hw4QJ9+/bF1dWVpk2bMmjQIFq1agVAUFAQTk5OTJkyRXddQkICP/zwA507d6ZWrVrUqVOHAQMGcODAgQztGTBgAG+88QbR0dF4e3vTokULXF1dadGiBXPnziU6Ojpd+YSEBBYtWkTHjh1xd3enTp06dO/enR9++IHExERduaxy2Pv27WPAgAHUrVsXNzc32rVrx6JFi4iKikpXbunSpTg5OXH+/Hk2bNhAp06dcHNzo0GDBowdO5Zbt25luLfInARsA02YMIHKlStz/vx5fHx8Xll+1apVDB48mLNnz/LWW2/Rr18/HBwcWL9+PV27duXGjRsZrlmyZAlnzpzB09OT+vXrU6dOHd25gwcPMmrUKBwcHPD09KRkyZLs3r2bUaNGMXz4cHbu3EnLli3p1KkTt2/fZvLkyRw7dkx3/bNnz+jWrRurV6+mdOnSeHp60rt3b+zs7Ni9ezd9+/YlNDQ0V35W+cnS0pJOnTqRmJjI7t27M5zfuXMniYmJdO/ePd3xzZs3M336dCpVqkS/fv2wt7dn/fr19OnTJ13QVhSF8ePHM336dMLCwujcuTO9e/cmKiqK6dOnM3HiRL3tGjduHElJSXh5eeHk5MSQIUN02xU7ODgwevRoWrduDaT+0RkyZAje3t4oikKvXr3o0qULt2/fZvTo0SxatCjD/RVFYeDAgezYsYMmTZrQr18/FEVh7dq1Gdo0btw4Vq5ciY2NDX369KF79+5ERETg7e3NjBkzXvkznjlzJuPGjSM4OJiWLVvSu3dvzMzMWLlyJT169ND7e/R///d/zJs3j+rVq+Pl5UWFChX4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\n",
      "text/plain": [
       "<Figure size 400x300 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "matrix = confusion_matrix(y_test, predictions, labels=[0,1]).astype(np.float32)\n",
    "s = matrix.sum(axis=1)\n",
    "for i in range(2):\n",
    "    matrix[i,:]=matrix[i,:] /s[i]\n",
    "matrix = np.round(matrix,3)  * 100\n",
    "df_cm = pd.DataFrame(matrix, ['Normal', 'Hypertension'], ['Normal', 'Hypertension'])\n",
    "plt.figure(figsize=(4,3))\n",
    "sn.set(font_scale=1.4) # for label size\n",
    "sn.heatmap(df_cm, annot=True, annot_kws={\"size\": 16}, fmt='.1f') # font size\n",
    "print(\"Model: MiniROCKET + BalancedRandomForestClassifier - using {}% of training set\".format(training_data_ratio*100))\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
